﻿using System;
using System.Linq;
using System.Web.Security;
using log4net;
using RIBA.Web.Model;

namespace RIBA.Web.Services
{
	public class CustomMembershipProvider: MembershipProvider
	{
		private static readonly ILog _log = LogManager.GetLogger(typeof(CustomMembershipProvider));

		public override string ApplicationName
		{
			get { return "RIBA"; }
			set { throw new NotImplementedException(); }
		}

		public override bool ChangePassword(string username, string oldPassword, string newPassword)
		{
			throw new NotImplementedException();
		}

		public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
		{
			throw new NotImplementedException();
		}

		public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
		{
			throw new NotImplementedException();
		}

		public override bool DeleteUser(string username, bool deleteAllRelatedData)
		{
			throw new NotImplementedException();
		}

		public override bool EnablePasswordReset
		{
			get { throw new NotImplementedException(); }
		}

		public override bool EnablePasswordRetrieval
		{
			get { throw new NotImplementedException(); }
		}

		public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
		{
			throw new NotImplementedException();
		}

		public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
		{
			throw new NotImplementedException();
		}

		public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
		{
			throw new NotImplementedException();
		}

		public override int GetNumberOfUsersOnline()
		{
			throw new NotImplementedException();
		}

		public override string GetPassword(string username, string answer)
		{
			throw new NotImplementedException();
		}

		public override MembershipUser GetUser(string username, bool userIsOnline)
		{
			try
			{
				var context = new UserEntitiesMock();
				var q =
					from u in context.Users
					where u.Name == username
					select u;

				var us = q.FirstOrDefault();

				var mu = new MembershipUser("CustomMembershipProvider", us.Name, us.Name, "", "", "", true, false, DateTime.Now,
																		DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);

				return mu;
			}
			catch (Exception ex)
			{
				_log.Fatal(string.Format("Error in GetUser. username='{0}'", username), ex);
				return null;
			}
		}

		public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
		{
			throw new NotImplementedException();
		}

		public override string GetUserNameByEmail(string email)
		{
			throw new NotImplementedException();
		}

		public override int MaxInvalidPasswordAttempts
		{
			get { throw new NotImplementedException(); }
		}

		public override int MinRequiredNonAlphanumericCharacters
		{
			get { throw new NotImplementedException(); }
		}

		public override int MinRequiredPasswordLength
		{
			get { throw new NotImplementedException(); }
		}

		public override int PasswordAttemptWindow
		{
			get { throw new NotImplementedException(); }
		}

		public override MembershipPasswordFormat PasswordFormat
		{
			get { throw new NotImplementedException(); }
		}

		public override string PasswordStrengthRegularExpression
		{
			get { throw new NotImplementedException(); }
		}

		public override bool RequiresQuestionAndAnswer
		{
			get { throw new NotImplementedException(); }
		}

		public override bool RequiresUniqueEmail
		{
			get { throw new NotImplementedException(); }
		}

		public override string ResetPassword(string username, string answer)
		{
			throw new NotImplementedException();
		}

		public override bool UnlockUser(string userName)
		{
			throw new NotImplementedException();
		}

		public override void UpdateUser(MembershipUser user)
		{
			throw new NotImplementedException();
		}

		public override bool ValidateUser(string username, string password)
		{
			try
			{
				_log.DebugFormat("ValidateUser. username='{0}', password='{1}'", username, password);

				var entities = new UserEntitiesMock();
				var isValid = entities.Users.Any(u => u.Name == username && u.Password == password);
				return isValid;
			}
			catch (Exception ex)
			{
				_log.Fatal(string.Format("Error in ValidateUser. username='{0}', password='{1}'", username, password), ex);
				return false;
			}
		}
	}
}